Publié le 12 septembre 2024
Rechercher et remplacer
A la mano
La fonction rechercher vous connaissez? On peut la déclencher par le raccourci ctrl+f (find) dans la plupart des logiciels pour rechercher un texte.
La fonction rechercher et remplacer vous connaissez? On peut la déclencher par le raccourci ctrl+h (pourquoi “h”?) dans la plupart des logiciels pour rechercher et remplacer un texte.
Bien pratique dans un éditeur de texte ou un traitement de texte.
En auto
Passons maintenant dans le terminal pour remplacer un texte en ligne de commande avec la commande sed
Exemple: sed -i "s/mot_a_remplacer/nouveau_mot/g"
Cette commande remplace toutes les occurrences de “mot_a_remplacer” par “nouveau_mot”. L’option -i modifie le fichier directement (écrasement). On est déjà pas mal, mais passons à la vitesse supérieure.
Nous allons maintenant appliquer ces changements pour tous les fichiers html contenu dans un dossier et ses sous-dossier (recherche dite récursive).
find "dossier" -type f -name "*.html" -exec sed -i 's/mot_a_remplacer/nouveau_mot/g' {} +
Explications
Recherche récursive de tous les fichiers avec l’extension .html dans le dossier spécifié (dossier).
find "dossier" -type f -name "*.html"
Remplacer toutes les occurrences de “mot_a_remplacer” par “nouveau_mot” dans chaque fichier trouvé. L’option ‘-i’ modifie les fichiers directement et le ‘+’ permet d’exécuter la commande sed sur plusieurs fichiers en une seule fois.
sed -i 's/mot_a_remplacer/nouveau_mot/g' {}
En full auto avec description
On va pousser encore un peu plus loin et se créer un petit script avec en paramètre d’entrée: * le mot à remplacer * le nouveau mot * l’extension de fichier dans lesquel rechercher * le dossier dans lequel rechercher
On veillera a pouvoir mettre en entrée un mot isolé mais également une suite de mots avec des espaces. Pour faciliter l’usage on prévoira également une aide qui apparaîttra si on tape –help, pratique courante dans l’univers Linux.
L’usage sera donc le suivant:
./remplacer.sh "un chien beige" "un chat gris" html "dossier de recherche"
#!/bin/bash
# Afficher l'aide si --help est demandé ou si le nombre d'arguments est incorrect
if [ "$1" == "--help" ] || [ "$#" -ne 4 ]; then
echo "Usage: $0 <mot_à_remplacer> <nouveau_mot> <extension_de_fichier> <dossier>"
echo
echo "Remplace toutes les occurrences du mot_à_remplacer par nouveau_mot"
echo "dans les fichiers avec l'extension spécifiée, de façon récursive dans le dossier donné."
echo
echo "Arguments :"
echo " <mot_à_remplacer> Le mot ou l'expression à rechercher (utiliser des guillemets si c'est une suite de mots)."
echo " <nouveau_mot> Le mot ou l'expression qui remplacera l'ancien mot (utiliser des guillemets si c'est une suite de mots)."
echo " <extension_de_fichier> L'extension des fichiers (par exemple, html, txt)."
echo " <dossier> Le chemin du dossier où effectuer la recherche."
exit 0
fi
# Variables d'entrée
mot_a_remplacer=$1
nouveau_mot=$2
extension=$3
folder=$4
# Vérifier si le dossier existe
if [ ! -d "$folder" ]; then
echo "Erreur : Le dossier '$folder' n'existe pas."
exit 1
fi
# Remplacer le mot à remplacer par le nouveau mot dans tous les fichiers du type spécifié
find "$folder" -type f -name "*.$extension" -exec sed -i "s/$mot_a_remplacer/$nouveau_mot/g" {} +
echo "Remplacement de '$mot_a_remplacer' par '$nouveau_mot' terminé dans tous les fichiers .$extension du dossier $folder."
Une petite note pour finir, la recherche telle que nous la faisons remplacera également des parties de mots. Attention donc à tous les mots qui comporteraient cette suite de lettres. Si je veux remplacer le mot “remplace” par “détrône” par exemple, alors “remplacement” sera aussi remplacé par “detrônement”, pas de problème. En revanche si je veux remplacer “eau” par “lait” alors “château” deviendra aussi “chatlait”, oups ça ne veut plus rien dire!
Il est possible de limiter le remplacement à un mot complet en ajoutant la balise \b, exemple:
find "$folder" -type f -name "*.$extension" -exec sed -i -E "s/\b$mot_a_remplacer\b/$nouveau_mot/g" {} +
Remarque: -E : Active les expressions régulières étendues.